package com.ce.util.chart;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.ce.framework.util.StringUtil;

/**
* 嫦娥软件有限公司 版权所有 2013
* 创建人：andy
* 创建日期：2010-9-25
* 创建时间：下午03:29:16
* 功能描述：柱状图的XML文件生成类，可使用此类方便的构造柱状图的数据文件，使用时调用toString方法即可。如：
* 		ColumnChart pc = new ColumnChart("柱状统计图");
* 		pc.addData("男", "114").addAttribute("url", "http://www.b.com");
* 		pc.addData("女", "100",null,"#00ff00");
* 		System.out.println(pc);
* ==============================================
* 修改历史
* 修改人		修改时间		修改原因
*
* ==============================================
*/
public class ColumnChart extends AbstractChart {
	private List<ChartGroup> datagroup;
	
	public static void main(String[] args){
		ColumnChart pc = new ColumnChart("柱状统计图");
		pc.addData("男", "114").addAttribute("url", "http://www.b.com");
		pc.addData("女", "100",null,"#00ff00");
		System.out.println(pc);
		pc = new ColumnChart("柱状统计图");
		pc.addData("男", "114","中国");
		pc.addData("女", "100","中国");
		pc.addData("男", "124","英国");
		pc.addData("女", "110","英国");
		System.out.println(pc);
	}

	public ColumnChart(String title) {
		super(title);
		this.datagroup = new ArrayList<ChartGroup>();
		datagroup.add(new ChartGroup(""));
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-9-25  下午03:32:00
	* 功能描述: 添加数据分组，即在图中显示多组数据，以便于多组数据进行比较，此方法中的分组颜色为系统默认颜色
	* 方法的参数和返回值: 
	* @param title	分组显示标题
	* @return
	*/
	public ChartGroup addGroup(String title){
		return this.addGroup(title,null);
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-9-25  下午03:33:15
	* 功能描述: 添加数据分组，即在图中显示多组数据，以便于多组数据进行比较
	* 方法的参数和返回值: 
	* @param title	分组显示标题
	* @param color	指定分组显示的颜色，为空时使用系统默认颜色
	* @return
	*/
	public ChartGroup addGroup(String title, String color){
		ChartGroup item = new ChartGroup(title,color);
		datagroup.add(item);
		return item;
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-9-25  下午03:33:38
	* 功能描述: 添加要显示的数据，不对数据进行分组
	* 方法的参数和返回值: 
	* @param label	统计图中X轴的显示标签
	* @param value	统计图中Y轴的显示值
	* @return		返回添加后的数据对象，可在返回的对象上附加其它属性
	*/
	public ChartData addData(String label, String value){
		return this.addData(label, value, null,null);
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-9-25  下午03:38:29
	* 功能描述: 添加要显示的数据，并对数据进行分组
	* 方法的参数和返回值: 
	* @param label	统计图中X轴的显示标签
	* @param value	统计图中Y轴的显示值
	* @param groupTitle	数据分组的标题
	* @return		返回添加后的数据对象，可在返回的对象上附加其它属性
	*/
	public ChartData addData(String label, String value, String groupTitle){
		return this.addData(label, value, groupTitle,null);
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-9-25  下午03:35:59
	* 功能描述: 添加要显示的数据，对数据进行分组，并指定本数据显示的颜色（用来与本组其它数据区分）
	* 方法的参数和返回值: 
	* @param label	统计图中X轴的显示标签
	* @param value	统计图中Y轴的显示值
	* @param groupTitle	数据分组的标题
	* @param color	当前数据的显示颜色
	* @return		返回添加后的数据对象，可在返回的对象上附加其它属性
	*/
	public ChartData addData(String label, String value, String groupTitle, String color){
		ChartData item = new ChartData(label,value,color);
		ChartGroup cg = datagroup.get(0);
		if(StringUtil.isNotBlank(groupTitle)){
			cg = null;
			int pos = datagroup.indexOf(new ChartGroup(groupTitle));
			if(pos>0){
				cg = datagroup.get(pos);
			}
			else{
				cg = this.addGroup(groupTitle);
			}
		}
		cg.addData(item);
		return item;
	}

	public String toString(){
		StringWriter sw = new StringWriter();
		PrintWriter out = new PrintWriter(sw);
		out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
		root = new Element("chart");
		this.addTitle2Root();
		Element series = root.addChild("series");
		Element graphs = root.addChild("graphs");
		List<String> labels = new ArrayList<String>();
		HashMap<String,String> key = new HashMap<String,String>();
		int index = 10;
		for(ChartGroup cg:datagroup){
			if(cg.getData().isEmpty())
				continue;
			Element graph = graphs.addChild(cg.toElement());
			for(ChartData item:cg.getData()){
				if(!labels.contains(item.getTitle())){
					labels.add(item.getTitle());
					key.put(item.getTitle(), ""+(index++));
				}
				graph.addChild(new ChartValue(key.get(item.getTitle()),item.getValue()).setOtherAttr(item.getOtherAttr()).toElement());
			}
		}
		for(int i=0;i<labels.size();i++){
			series.addChild("value", labels.get(i)).setAttribute("xid", key.get(labels.get(i)));
		}
		out.print(root.toString());
		return sw.toString();
	}

}
